От: Anton "dmde@mail.primorye.ru" Кому: "kaev@yandex.ru" Тема: Может кому поможет Дата: 22 марта 2001 г. 7:00
Привет Артем. Пишу прогу на С и столкнулся с такой проблемой: Как узнать имя каталога, из которого запущен exe ?
Есть простая функция GetCurrentDirectiry(), но есть случаи когда она не срабатывает. Например, если программа запускается через ярлык и в ярлыке не проставлен рабочий каталог. А такое может случиться. Я нашел способ как это обойти /*перехожу с VB на VC, а в VB это просто свойсто объекта App*/ Возможно алгоритм не оптимален.
// execDlg.cpp : implementation file
//
#include "stdafx.h"
#include "tlhelp32.h"
CString DirName();
void CExecDlg::OnButton1()
{
m_List1.ResetContent();
CString str="";
str=DirName();
m_List1.AddString(str);
}
CString DirNameIt(char* exepath)
{
char *pdest;
char string2[255]="";
int result;
int ch = '\\'; // символ разделения пути
pdest = strrchr( exepath, ch ); // ищем
if( pdest != NULL )
{
// если нашли, то берем только каталог.
result = pdest - exepath ;
strncpy( string2, exepath, result );
}
else
strcpy (string2, "Critical Error");
return string2;
}
CString DirName()
{
// Позаимствовал из шагов про сканирование процессов
CString string="";
HANDLE hSnap;
hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnap == NULL)
{
string = "Error Load ToolHelp";
}
PROCESSENTRY32 proc;
if (Process32First(hSnap, &proc))
{
// если ID текущего процесса совпадет с ID сканируемого
if (GetCurrentProcessId() == proc.th32ProcessID )
string = DirNameIt(proc.szExeFile);
while (Process32Next(hSnap, &proc))
{
if (GetCurrentProcessId()==proc.th32ProcessID)
string = DirNameIt(proc.szExeFile);
}
}
return string;
}
С уважением. Антон.